home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-03-15 | 50.9 KB | 1,694 lines |
- Path: xanth!nic.MR.NET!hal!cwjcc!mailrus!ulowell!page
- From: page@swan.ulowell.edu (Bob Page)
- Newsgroups: comp.sources.amiga
- Subject: v89i061: tags - make a tags file for an editor
- Message-ID: <12245@swan.ulowell.edu>
- Date: 15 Mar 89 19:50:40 GMT
- Organization: University of Lowell, Computer Science Dept.
- Lines: 1683
- Approved: page@swan.ulowell.edu
-
- Submitted-by: grwalter@watcgl.waterloo.edu (Fred Walter)
- Posting-number: Volume 89, Issue 61
- Archive-name: unix/ctags.1
-
- # This is a shell archive.
- # Remove everything above and including the cut line.
- # Then run the rest of the file through sh.
- #----cut here-----cut here-----cut here-----cut here----#
- #!/bin/sh
- # shar: Shell Archiver
- # Run the following text with /bin/sh to create:
- # README
- # ORIGINAL_POSTER
- # Makefile
- # ctags.1
- # ctags.c
- # ctags.uu
- # tags
- # This archive created: Wed Mar 15 14:47:08 1989
- cat << \SHAR_EOF > README
- /*
- * The original of this version came over usenet (mod.sources Nov85).
- * I also applied the bug fix mentioned in comp.bugs.4bsd Mar88.
- *
- * This was compiled with Lattice C 5.0
- *
- * G. R. Walter (Fred) February 29, 1989
- */
- SHAR_EOF
- cat << \SHAR_EOF > ORIGINAL_POSTER
- Relay-Version: version B 2.10.2 9/18/84; site watmath.UUCP
- Posting-Version: version B 2.10.2 9/3/84; site panda.UUCP
- Path: watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!panda!sources-request
- From: sources-request@panda.UUCP
- Newsgroups: mod.sources
- Subject: ctags source
- Message-ID: <1145@panda.UUCP>
- Date: 30 Nov 85 18:21:54 GMT
- Date-Received: 1 Dec 85 04:02:09 GMT
- Sender: jpn@panda.UUCP
- Lines: 1184
- Approved: jpn@panda.UUCP
-
- Mod.sources: Volume 3, Issue 53
- Submitted by: ucbvax!ucsf-cgl.ARPA!arnold (Ken Arnold)
-
-
- #!/bin/sh
- #
- # I have received enough requests for the current source to ctags to
- # post it. Here is the latest version (what will go out with 4.3,
- # modulo any bugs fixed during the beta period). It is the 4.2 ctags
- # with recognition of yacc and lex tags added. Files ending in .y are
- # presumed to be yacc files, .l files are either lisp or lex files,
- # depending upon the first non-blank character (yeah, it's a hack, but
- # it works). Man page is included. Note that I wrote the original
- # ctags (recognized only C), and added the YACC and lex after others
- # wrote the recognizers for FORTRAN, PASCAL, and lisp, so this code is
- # rather a mix of styles, for which I take no responsibility. So, here
- # come those famous words:
- SHAR_EOF
- cat << \SHAR_EOF > Makefile
- #
- # Makefile for Lattice C 5.0 on Amiga
- #
-
- .c.o:
- lc $(CFLAGS) $<
-
- CFLAGS = -cw -O
- LINKFLAGS = NODEBUG
- LIBS = lib:lc.lib
-
- all: ctags
- say "done all"
-
- ctags: ctags.o
- BLINK TO ctags FROM lib:cres.o ctags.o LIBRARY $(LIBS) $(LINKFLAGS)
-
- clean:
- delete ctags.o ctags
- SHAR_EOF
- cat << \SHAR_EOF > ctags.1
- .TH CTAGS 1 "25 August 1982"
- .UC 4
- .SH NAME
- ctags \- create a tags file
- .SH SYNOPSIS
- .B ctags
- [
- .B \-BFatuwvx
- ]
- name ...
- .SH DESCRIPTION
- .I Ctags
- makes a tags file for
- .IR ex (1)
- from the specified C, Pascal, Fortran, YACC, lex, and lisp sources.
- A tags file gives the locations of specified objects (in this case
- functions and typedefs) in a group of files. Each line of the tags
- file contains the object name, the file in which it is defined, and
- an address specification for the object definition. Functions are
- searched with a pattern, typedefs with a line number. Specifiers are
- given in separate fields on the line, separated by blanks or tabs.
- Using the
- .I tags
- file,
- .I ex
- can quickly find these objects definitions.
- .PP
- If the
- .B \-x
- flag is given,
- .I ctags
- produces a list of object names, the line number and file
- name on which each is defined, as well as the text of that line
- and prints this on the standard output. This is a simple index
- which can be printed out as an off-line readable function index.
- .PP
- If the
- .B \-v
- flag is given,
- an index of the form expected by
- .IR vgrind (1)
- is produced on the standard output.
- This listing contains the function name,
- file name, and page number
- (assuming 64 line pages).
- Since the output will be sorted into lexicographic order,
- it may be desired to run the output through
- .BR "sort \-f" .
- Sample use:
- .nf
- ctags \-v files | sort \-f > index
- vgrind \-x index
- .fi
- .PP
- Files whose names end in
- .B \.c
- or
- .B \.h
- are assumed to be C source files and are searched for C routine and
- macro definitions.
- Files whose names end in
- .B \.y
- are assumed to be YACC source files.
- Files whose names end in
- .B \.l
- are assumed to be either lisp files
- if their first non-blank character is `;', `(', or `[',
- or lex files otherwise.
- Other files are first examined to see if they contain any Pascal or
- Fortran routine definitions; if not, they are processed again
- looking for C definitions.
- .PP
- Other options are:
- .TP 5
- .B \-F
- use forward searching patterns (/.../) (default).
- .TP 5
- .B \-B
- use backward searching patterns (?...?).
- .TP 5
- .B \-a
- append to tags file.
- .TP 5
- .B \-t
- create tags for typedefs.
- .TP 5
- .B \-w
- suppressing warning diagnostics.
- .TP 5
- .B \-u
- causing the specified files to be
- .I updated
- in tags, that is, all references to them are deleted,
- and the new values are appended to the file.
- (Beware: this option is implemented in a way which is rather slow;
- it is usually faster to simply rebuild the
- .I tags
- file.)
- .PP
- The tag
- .I main
- is treated specially in C programs.
- The tag formed is created by prepending
- .I M
- to the name of the file, with a trailing .c removed, if
- any, and leading pathname components also removed.
- This makes use of
- .I ctags
- practical in directories with more than one program.
- .SH FILES
- .DT
- tags output tags file
- .SH SEE ALSO
- ex(1), vi(1)
- .SH AUTHOR
- Ken Arnold; FORTRAN added by Jim Kleckner; Bill Joy
- added Pascal and
- .B \-x,
- replacing
- .I cxref;
- C typedefs added by Ed Pelegri-Llopart.
- .SH BUGS
- Recognition of \fBfunctions\fR, \fBsubroutines\fR and \fBprocedures\fR
- for FORTRAN and Pascal is done is a very simpleminded way.
- No attempt is made to deal with block structure; if you have two
- Pascal procedures in different blocks with the same name you lose.
- .PP
- The method of deciding whether to look for C or Pascal and FORTRAN
- functions is a hack.
- .PP
- Does not know about #ifdefs.
- .PP
- Should know about Pascal types.
- Relies on the input being well formed to detect typedefs.
- Use of -tx shows only the last line of typedefs.
- SHAR_EOF
- cat << \SHAR_EOF > ctags.c
- /* $Header */
-
- static char *sccsid = "@(#)ctags.c 4.7 (Berkeley) 8/18/83";
-
- #include <stdio.h>
- #include <ctype.h>
-
- /*
- * ctags: create a tags file
- */
-
- #define reg register
- #define bool char
-
- #define TRUE (1)
- #define FALSE (0)
-
- #define iswhite(arg) (_wht[arg]) /* T if char is white */
- #define begtoken(arg) (_btk[arg]) /* T if char can start token */
- #define intoken(arg) (_itk[arg]) /* T if char can be in token */
- #define endtoken(arg) (_etk[arg]) /* T if char ends tokens */
- #define isgood(arg) (_gd[arg]) /* T if char can be after ')' */
-
- /*
- * The following ifndefs were necessary to get this to compile on an Amiga.
- * The original of this version came over usenet (mod.sources Nov85).
- * I also applied the bug fix mentioned in comp.bugs.4bsd Mar88.
- *
- * Compile with Amiga Lattice C using : lc -cw -L ctags
- *
- * G. R. Walter (Fred) December 30, 1988
- */
- #ifndef AMIGA
- # define max(I1,I2) (I1 > I2 ? I1 : I2)
- #endif
- #ifdef AMIGA
- # define entry EnTrY
- # define index(S, C) strchr(S, C)
- # define cfree(C) free(C)
- #endif
-
- struct nd_st { /* sorting structure */
- char *entry; /* function or type name */
- char *file; /* file name */
- bool f; /* use pattern or line no */
- int lno; /* for -x option */
- char *pat; /* search pattern */
- bool been_warned; /* set if noticed dup */
- struct nd_st *left,*right; /* left and right sons */
- };
-
- long ftell();
- typedef struct nd_st NODE;
-
- bool number, /* T if on line starting with # */
- term = FALSE, /* T if print on terminal */
- makefile= TRUE, /* T if to creat "tags" file */
- gotone, /* found a func already on line */
- /* boolean "func" (see init) */
- _wht[0177],_etk[0177],_itk[0177],_btk[0177],_gd[0177];
-
- /* typedefs are recognized using a simple finite automata,
- * tydef is its state variable.
- */
- typedef enum {none, begin, middle, end } TYST;
-
- TYST tydef = none;
-
- char searchar = '/'; /* use /.../ searches */
-
- int lineno; /* line number of current line */
- char line[4*BUFSIZ], /* current input line */
- *curfile, /* current input file name */
- *outfile= "tags", /* output file */
- *white = " \f\t\n", /* white chars */
- *endtk = " \t\n\"'#()[]{}=-+%*/&|^~!<>;,.:?",
- /* token ending chars */
- *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz",
- /* token starting chars */
- *intk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz0123456789",
- /* valid in-token chars */
- *notgd = ",;"; /* non-valid after-function chars */
-
- int file_num; /* current file number */
- int aflag; /* -a: append to tags */
- int tflag; /* -t: create tags for typedefs */
- int uflag; /* -u: update tags */
- int wflag; /* -w: suppress warnings */
- int vflag; /* -v: create vgrind style index output */
- int xflag; /* -x: create cxref style output */
-
- char lbuf[BUFSIZ];
-
- FILE *inf, /* ioptr for current input file */
- *outf; /* ioptr for tags file */
-
- long lineftell; /* ftell after getc( inf ) == '\n' */
-
- NODE *head; /* the head of the sorted binary tree */
-
- char *savestr();
- #ifdef AMIGA
- char *rindex(), *strchr();
- #else
- char *rindex(), *index();
- #endif
- char *toss_comment();
-
- main(ac,av)
- int ac;
- char *av[];
- {
- char cmd[100];
- int i;
-
- while (ac > 1 && av[1][0] == '-') {
- for (i=1; av[1][i]; i++) {
- switch(av[1][i]) {
- case 'B':
- searchar='?';
- break;
- case 'F':
- searchar='/';
- break;
- case 'a':
- aflag++;
- break;
- case 't':
- tflag++;
- break;
- case 'u':
- uflag++;
- break;
- case 'w':
- wflag++;
- break;
- case 'v':
- vflag++;
- xflag++;
- break;
- case 'x':
- xflag++;
- break;
- default:
- goto usage;
- }
- }
- ac--; av++;
- }
-
- if (ac <= 1) {
- usage:
- printf("Usage: ctags [-BFatuwvx] file ...\n");
- exit(1);
- }
-
- init(); /* set up boolean "functions" */
- /*
- * loop through files finding functions
- */
- for (file_num = 1; file_num < ac; file_num++)
- find_entries(av[file_num]);
-
- if (xflag) {
- put_entries(head);
- exit(0);
- }
- if (uflag) {
- for (i=1; i<ac; i++) {
- sprintf(cmd,
- "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",
- outfile, av[i], outfile);
- system(cmd);
- }
- aflag++;
- }
- outf = fopen(outfile, aflag ? "a" : "w");
- if (outf == NULL) {
- perror(outfile);
- exit(1);
- }
- put_entries(head);
- fclose(outf);
- if (uflag) {
- sprintf(cmd, "sort %s -o %s", outfile, outfile);
- system(cmd);
- }
- exit(0);
- }
-
- /*
- * This routine sets up the boolean psuedo-functions which work
- * by seting boolean flags dependent upon the corresponding character
- * Every char which is NOT in that string is not a white char. Therefore,
- * all of the array "_wht" is set to FALSE, and then the elements
- * subscripted by the chars in "white" are set to TRUE. Thus "_wht"
- * of a char is TRUE if it is the string "white", else FALSE.
- */
- init()
- {
-
- reg char *sp;
- reg int i;
-
- for (i = 0; i < 0177; i++) {
- _wht[i] = _etk[i] = _itk[i] = _btk[i] = FALSE;
- _gd[i] = TRUE;
- }
- for (sp = white; *sp; sp++)
- _wht[*sp] = TRUE;
- for (sp = endtk; *sp; sp++)
- _etk[*sp] = TRUE;
- for (sp = intk; *sp; sp++)
- _itk[*sp] = TRUE;
- for (sp = begtk; *sp; sp++)
- _btk[*sp] = TRUE;
- for (sp = notgd; *sp; sp++)
- _gd[*sp] = FALSE;
- }
-
- /*
- * This routine opens the specified file and calls the function
- * which finds the function and type definitions.
- */
- find_entries(file)
- char *file;
- {
- char *cp;
-
- if ((inf = fopen(file,"r")) == NULL) {
- perror(file);
- return;
- }
- curfile = savestr(file);
- lineno = 0;
- cp = rindex(file, '.');
- /* .l implies lisp or lex source code */
- if (cp && cp[1] == 'l' && cp[2] == '\0') {
- if (index(";([", first_char()) != NULL) { /* lisp */
- L_funcs(inf);
- fclose(inf);
- return;
- }
- else { /* lex */
- /*
- * throw away all the code before the second "%%"
- */
- toss_yysec();
- getline();
- pfnote("yylex", lineno, TRUE);
- toss_yysec();
- C_entries();
- fclose(inf);
- return;
- }
- }
- /* .y implies a yacc file */
- if (cp && cp[1] == 'y' && cp[2] == '\0') {
- toss_yysec();
- Y_entries();
- C_entries();
- fclose(inf);
- return;
- }
- /* if not a .c or .h file, try fortran */
- if (cp && (cp[1] != 'c' && cp[1] != 'h') && cp[2] == '\0') {
- if (PF_funcs(inf) != 0) {
- fclose(inf);
- return;
- }
- rewind(inf); /* no fortran tags found, try C */
- }
- C_entries();
- fclose(inf);
- }
-
- pfnote(name, ln, f)
- char *name;
- int ln;
- bool f; /* f == TRUE when function */
- {
- register char *fp;
- register NODE *np;
- char nbuf[BUFSIZ];
-
- if ((np = (NODE *) malloc(sizeof (NODE))) == NULL) {
- fprintf(stderr, "ctags: too many entries to sort\n");
- put_entries(head);
- free_tree(head);
- head = np = (NODE *) malloc(sizeof (NODE));
- }
- if (xflag == 0 && !strcmp(name, "main")) {
- fp = rindex(curfile, '/');
- if (fp == 0)
- fp = curfile;
- else
- fp++;
- sprintf(nbuf, "M%s", fp);
- fp = rindex(nbuf, '.');
- if (fp && fp[2] == 0)
- *fp = 0;
- name = nbuf;
- }
- np->entry = savestr(name);
- np->file = curfile;
- np->f = f;
- np->lno = ln;
- np->left = np->right = 0;
- if (xflag == 0) {
- lbuf[50] = 0;
- strcat(lbuf, "$");
- lbuf[50] = 0;
- }
- np->pat = savestr(lbuf);
- if (head == NULL)
- head = np;
- else
- add_node(np, head);
- }
-
- /*
- * This routine finds functions and typedefs in C syntax and adds them
- * to the list.
- */
- C_entries()
- {
- register int c;
- register char *token, *tp;
- bool incomm, inquote, inchar, midtoken;
- int level;
- char *sp;
- char tok[BUFSIZ];
-
- number = gotone = midtoken = inquote = inchar = incomm = FALSE;
- level = 0;
- sp = tp = token = line;
- lineno++;
- lineftell = ftell(inf);
- for (;;) {
- *sp = c = getc(inf);
- if (feof(inf))
- break;
- if (c == '\n')
- lineno++;
- else if (c == '\\') {
- c = *++sp = getc(inf);
- if (c == '\n')
- c = ' ';
- }
- else if (incomm) {
- if (c == '*') {
- while ((*++sp=c=getc(inf)) == '*')
- continue;
- if (c == '\n')
- lineno++;
- if (c == '/')
- incomm = FALSE;
- }
- }
- else if (inquote) {
- /*
- * Too dumb to know about \" not being magic, but
- * they usually occur in pairs anyway.
- */
- if (c == '"')
- inquote = FALSE;
- continue;
- }
- else if (inchar) {
- if (c == '\'')
- inchar = FALSE;
- continue;
- }
- else switch (c) {
- case '"':
- inquote = TRUE;
- continue;
- case '\'':
- inchar = TRUE;
- continue;
- case '/':
- if ((*++sp=c=getc(inf)) == '*')
- incomm = TRUE;
- else
- ungetc(*sp, inf);
- continue;
- case '#':
- if (sp == line)
- number = TRUE;
- continue;
- case '{':
- if (tydef == begin) {
- tydef=middle;
- }
- level++;
- continue;
- case '}':
- if (sp == line)
- level = 0; /* reset */
- else
- level--;
- if (!level && tydef==middle) {
- tydef=end;
- }
- continue;
- }
- if (!level && !inquote && !incomm && gotone == FALSE) {
- if (midtoken) {
- if (endtoken(c)) {
- int f;
- int pfline = lineno;
- if (start_entry(&sp,token,tp,&f)) {
- strncpy(tok,token,tp-token+1);
- tok[tp-token+1] = 0;
- getline();
- pfnote(tok, pfline, f);
- gotone = f; /* function */
- }
- midtoken = FALSE;
- token = sp;
- }
- else if (intoken(c))
- tp++;
- }
- else if (begtoken(c)) {
- token = tp = sp;
- midtoken = TRUE;
- }
- }
- if (c == ';' && tydef==end) /* clean with typedefs */
- tydef=none;
- sp++;
- if (c == '\n' || sp > &line[sizeof (line) - BUFSIZ]) {
- tp = token = sp = line;
- lineftell = ftell(inf);
- number = gotone = midtoken = inquote = inchar = FALSE;
- }
- }
- }
-
- /*
- * This routine checks to see if the current token is
- * at the start of a function, or corresponds to a typedef
- * It updates the input line * so that the '(' will be
- * in it when it returns.
- */
- start_entry(lp,token,tp,f)
- char **lp,*token,*tp;
- int *f;
- {
- reg char c,*sp;
- static bool found;
- bool firsttok; /* T if have seen first token in ()'s */
- int bad;
-
- *f = 1; /* a function */
- sp = *lp;
- c = *sp;
- bad = FALSE;
- if (!number) { /* space is not allowed in macro defs */
- while (iswhite(c)) {
- *++sp = c = getc(inf);
- if (c == '\n') {
- lineno++;
- if (sp > &line[sizeof (line) - BUFSIZ])
- goto ret;
- }
- }
- /* the following tries to make it so that a #define a b(c) */
- /* doesn't count as a define of b. */
- }
- else {
- if (!strncmp(token, "define", 6))
- found = 0;
- else
- found++;
- if (found >= 2) {
- gotone = TRUE;
- badone: bad = TRUE;
- goto ret;
- }
- }
- /* check for the typedef cases */
- if (tflag && !strncmp(token, "typedef", 7)) {
- tydef=begin;
- goto badone;
- }
- if (tydef==begin && (!strncmp(token, "struct", 6) ||
- !strncmp(token, "union", 5) || !strncmp(token, "enum", 4))) {
- goto badone;
- }
- if (tydef==begin) {
- tydef=end;
- goto badone;
- }
- if (tydef==end) {
- *f = 0;
- goto ret;
- }
- if (c != '(')
- goto badone;
- firsttok = FALSE;
- while ((*++sp=c=getc(inf)) != ')') {
- if (c == '\n') {
- lineno++;
- if (sp > &line[sizeof (line) - BUFSIZ])
- goto ret;
- }
- /*
- * This line used to confuse ctags:
- * int (*oldhup)();
- * This fixes it. A nonwhite char before the first
- * token, other than a / (in case of a comment in there)
- * makes this not a declaration.
- */
- if (begtoken(c) || c=='/')
- firsttok++;
- else if (!iswhite(c) && !firsttok)
- goto badone;
- }
- while (iswhite(*++sp=c=getc(inf)))
- if (c == '\n') {
- lineno++;
- if (sp > &line[sizeof (line) - BUFSIZ])
- break;
- }
- ret:
- *lp = --sp;
- if (c == '\n')
- lineno--;
- ungetc(c,inf);
- return !bad && (!*f || isgood(c));
- /* hack for typedefs */
- }
-
- /*
- * Y_entries:
- * Find the yacc tags and put them in.
- */
- Y_entries()
- {
- register char *sp, *orig_sp;
- register int brace;
- register bool in_rule, toklen;
- char tok[BUFSIZ];
-
- brace = 0;
- getline();
- pfnote("yyparse", lineno, TRUE);
- while (fgets(line, sizeof line, inf) != NULL)
- for (sp = line; *sp; sp++)
- switch (*sp) {
- case '\n':
- lineno++;
- /* FALLTHROUGH */
- case ' ':
- case '\t':
- case '\f':
- case '\r':
- break;
- case '"':
- do {
- while (*++sp != '"')
- continue;
- } while (sp[-1] == '\\');
- break;
- case '\'':
- do {
- while (*++sp != '\'')
- continue;
- } while (sp[-1] == '\\');
- break;
- case '/':
- if (*++sp == '*')
- sp = toss_comment(sp);
- else
- --sp;
- break;
- case '{':
- brace++;
- break;
- case '}':
- brace--;
- break;
- case '%':
- if (sp[1] == '%' && sp == line)
- return;
- break;
- case '|':
- case ';':
- in_rule = FALSE;
- break;
- default:
- if (brace == 0 && !in_rule && (isalpha(*sp) ||
- *sp == '.' ||
- *sp == '_')) {
- orig_sp = sp;
- ++sp;
- while (isalnum(*sp) || *sp == '_' ||
- *sp == '.')
- sp++;
- toklen = sp - orig_sp;
- while (isspace(*sp))
- sp++;
- if (*sp == ':' || (*sp == '\0' &&
- first_char() == ':'))
- {
- strncpy(tok, orig_sp, toklen);
- tok[toklen] = '\0';
- strcpy(lbuf, line);
- lbuf[strlen(lbuf) - 1] = '\0';
- pfnote(tok, lineno, TRUE);
- in_rule = TRUE;
- }
- else
- sp--;
- }
- break;
- }
- }
-
- char *
- toss_comment(start)
- char *start;
- {
- register char *sp;
-
- /*
- * first, see if the end-of-comment is on the same line
- */
- do {
- while ((sp = index(start, '*')) != NULL)
- if (sp[1] == '/')
- return ++sp;
- else
- start = ++sp;
- start = line;
- lineno++;
- } while (fgets(line, sizeof line, inf) != NULL);
- }
-
- getline()
- {
- long saveftell = ftell( inf );
- register char *cp;
-
- fseek( inf , lineftell , 0 );
- fgets(lbuf, sizeof lbuf, inf);
- cp = rindex(lbuf, '\n');
- if (cp)
- *cp = 0;
- fseek(inf, saveftell, 0);
- }
-
- free_tree(node)
- NODE *node;
- {
-
- while (node) {
- free_tree(node->right);
- cfree(node);
- node = node->left;
- }
- }
-
- add_node(node, cur_node)
- NODE *node,*cur_node;
- {
- register int dif;
-
- dif = strcmp(node->entry, cur_node->entry);
- if (dif == 0) {
- if (node->file == cur_node->file) {
- if (!wflag) {
- fprintf(stderr,"Duplicate entry in file %s, line %d: %s\n",
- node->file,lineno,node->entry);
- fprintf(stderr,"Second entry ignored\n");
- }
- return;
- }
- if (!cur_node->been_warned)
- if (!wflag)
- fprintf(stderr,"Duplicate entry in files %s and %s: %s (Warning only)\n",
- node->file, cur_node->file, node->entry);
- cur_node->been_warned = TRUE;
- return;
- }
-
- if (dif < 0) {
- if (cur_node->left != NULL)
- add_node(node,cur_node->left);
- else
- cur_node->left = node;
- return;
- }
- if (cur_node->right != NULL)
- add_node(node,cur_node->right);
- else
- cur_node->right = node;
- }
-
- put_entries(node)
- reg NODE *node;
- {
- reg char *sp;
-
- if (node == NULL)
- return;
- put_entries(node->left);
- if (xflag == 0)
- if (node->f) { /* a function */
- fprintf(outf, "%s\t%s\t%c^",
- node->entry, node->file, searchar);
- for (sp = node->pat; *sp; sp++)
- if (*sp == '\\')
- fprintf(outf, "\\\\");
- else if (*sp == searchar)
- fprintf(outf, "\\%c", searchar);
- else
- putc(*sp, outf);
- fprintf(outf, "%c\n", searchar);
- }
- else { /* a typedef; text pattern inadequate */
- fprintf(outf, "%s\t%s\t%d\n",
- node->entry, node->file, node->lno);
- }
- else if (vflag)
- fprintf(stdout, "%s %s %d\n",
- node->entry, node->file, (node->lno+63)/64);
- else
- fprintf(stdout, "%-16s%4d %-16s %s\n",
- node->entry, node->lno, node->file, node->pat);
- put_entries(node->right);
- }
- char *dbp = lbuf;
- int pfcnt;
-
- PF_funcs(fi)
- FILE *fi;
- {
-
- pfcnt = 0;
- while (fgets(lbuf, sizeof(lbuf), fi)) {
- lineno++;
- dbp = lbuf;
- if ( *dbp == '%' ) dbp++ ; /* Ratfor escape to fortran */
- while (isspace(*dbp))
- dbp++;
- if (*dbp == 0)
- continue;
- switch (*dbp |' ') {
-
- case 'i':
- if (tail("integer"))
- takeprec();
- break;
- case 'r':
- if (tail("real"))
- takeprec();
- break;
- case 'l':
- if (tail("logical"))
- takeprec();
- break;
- case 'c':
- if (tail("complex") || tail("character"))
- takeprec();
- break;
- case 'd':
- if (tail("double")) {
- while (isspace(*dbp))
- dbp++;
- if (*dbp == 0)
- continue;
- if (tail("precision"))
- break;
- continue;
- }
- break;
- }
- while (isspace(*dbp))
- dbp++;
- if (*dbp == 0)
- continue;
- switch (*dbp|' ') {
-
- case 'f':
- if (tail("function"))
- getit();
- continue;
- case 's':
- if (tail("subroutine"))
- getit();
- continue;
- case 'p':
- if (tail("program")) {
- getit();
- continue;
- }
- if (tail("procedure"))
- getit();
- continue;
- }
- }
- return (pfcnt);
- }
-
- tail(cp)
- char *cp;
- {
- register int len = 0;
-
- while (*cp && (*cp&~' ') == ((*(dbp+len))&~' '))
- cp++, len++;
- if (*cp == 0) {
- dbp += len;
- return (1);
- }
- return (0);
- }
-
- takeprec()
- {
-
- while (isspace(*dbp))
- dbp++;
- if (*dbp != '*')
- return;
- dbp++;
- while (isspace(*dbp))
- dbp++;
- if (!isdigit(*dbp)) {
- --dbp; /* force failure */
- return;
- }
- do
- dbp++;
- while (isdigit(*dbp));
- }
-
- getit()
- {
- register char *cp;
- char c;
- char nambuf[BUFSIZ];
-
- for (cp = lbuf; *cp; cp++)
- ;
- *--cp = 0; /* zap newline */
- while (isspace(*dbp))
- dbp++;
- if (*dbp == 0 || !isalpha(*dbp))
- return;
- for (cp = dbp+1; *cp && (isalpha(*cp) || isdigit(*cp)); cp++)
- continue;
- c = cp[0];
- cp[0] = 0;
- strcpy(nambuf, dbp);
- cp[0] = c;
- pfnote(nambuf, lineno, TRUE);
- pfcnt++;
- }
-
- char *
- savestr(cp)
- char *cp;
- {
- register int len;
- register char *dp;
-
- len = strlen(cp);
- dp = (char *)malloc(len+1);
- strcpy(dp, cp);
- return (dp);
- }
-
- /*
- * Return the ptr in sp at which the character c last
- * appears; NULL if not found
- *
- * Identical to v7 rindex, included for portability.
- */
-
- char *
- rindex(sp, c)
- register char *sp, c;
- {
- register char *r;
-
- r = NULL;
- do {
- if (*sp == c)
- r = sp;
- } while (*sp++);
- return(r);
- }
-
- /*
- * lisp tag functions
- * just look for (def or (DEF
- */
-
- L_funcs (fi)
- FILE *fi;
- {
- register int special;
-
- pfcnt = 0;
- while (fgets(lbuf, sizeof(lbuf), fi)) {
- lineno++;
- dbp = lbuf;
- if (dbp[0] == '(' &&
- (dbp[1] == 'D' || dbp[1] == 'd') &&
- (dbp[2] == 'E' || dbp[2] == 'e') &&
- (dbp[3] == 'F' || dbp[3] == 'f')) {
- dbp += 4;
- if (striccmp(dbp, "method") == 0 ||
- striccmp(dbp, "wrapper") == 0 ||
- striccmp(dbp, "whopper") == 0)
- special = TRUE;
- else
- special = FALSE;
- while (!isspace(*dbp))
- dbp++;
- while (isspace(*dbp))
- dbp++;
- L_getit(special);
- }
- }
- }
-
- L_getit(special)
- int special;
- {
- register char *cp;
- register char c;
- char nambuf[BUFSIZ];
-
- for (cp = lbuf; *cp; cp++)
- continue;
- *--cp = 0; /* zap newline */
- if (*dbp == 0)
- return;
- if (special) {
- if ((cp = index(dbp, ')')) == NULL)
- return;
- while (cp >= dbp && *cp != ':')
- cp--;
- if (cp < dbp)
- return;
- dbp = cp;
- while (*cp && *cp != ')' && *cp != ' ')
- cp++;
- }
- else
- for (cp = dbp + 1; *cp && *cp != '(' && *cp != ' '; cp++)
- continue;
- c = cp[0];
- cp[0] = 0;
- strcpy(nambuf, dbp);
- cp[0] = c;
- pfnote(nambuf, lineno,TRUE);
- pfcnt++;
- }
-
- /*
- * striccmp:
- * Compare two strings over the length of the second, ignoring
- * case distinctions. If they are the same, return 0. If they
- * are different, return the difference of the first two different
- * characters. It is assumed that the pattern (second string) is
- * completely lower case.
- */
- striccmp(str, pat)
- register char *str, *pat;
- {
- register int c1;
-
- while (*pat) {
- if (isupper(*str))
- c1 = tolower(*str);
- else
- c1 = *str;
- if (c1 != *pat)
- return c1 - *pat;
- pat++;
- str++;
- }
- return 0;
- }
-
- /*
- * first_char:
- * Return the first non-blank character in the file. After
- * finding it, rewind the input file so we start at the beginning
- * again.
- */
- first_char()
- {
- register int c;
- register long off;
-
- off = ftell(inf);
- while ((c = getc(inf)) != EOF)
- if (!isspace(c) && c != '\r') {
- fseek(inf, off, 0);
- return c;
- }
- fseek(inf, off, 0);
- return EOF;
- }
-
- /*
- * toss_yysec:
- * Toss away code until the next "%%" line.
- */
- toss_yysec()
- {
- char buf[BUFSIZ];
-
- for (;;) {
- lineftell = ftell(inf);
- if (fgets(buf, BUFSIZ, inf) == NULL)
- return;
- lineno++;
- if (strncmp(buf, "%%", 2) == 0)
- return;
- }
- }
- SHAR_EOF
- cat << \SHAR_EOF > ctags.uu
-
- begin 644 ctags
- M```#\P`````````"``````````$```\\```!=@```^D```\\)$@D`$GY````$
- M`"QX``1(Y\#@F?P`````(#P``!38(CP``0`!3J[_.DJ`9P`!LB!`)$`B0"`\/
- M```!:2#<4X!F^B`<9PX@2='<U=`@BB1)4X!@\"A)V?P`````3-\'`RQX``0I+
- M3@7<*4\%Y$*L!>`F;@$4<``B/```,`!.KO[.*6L`F`782JL`K&<``'`@#Y"O!
- M``0&@````(`I0`6H80`!2B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI207LT(%2,
- M@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(`!3@A^Q-
- M(``@`%'*__@B3R\)8```>"EK`#H%J'!_4H#1K`6H80``WD'K`%Q.KOZ`0>L`F
- M7$ZN_HPI0`7@+P`D0"`J`"1G$BQL%-0@0"(H```I00783J[_@B(J`"!G&B0\E
- M```#[4ZN_^(I0`7H9PKEB"!`)V@`"`"D(&P%X"\(2&P%I"!H`"0I:``$!>Q.A
- MNA?N3KH=DG``8`0@+P`$+P`@+`709P0@0$Z03KHN*BQX``0B;!343J[^8DZZX
- M%\1*K`7@9QHB+`7H9P1.KO_<+'@`!$ZN_WPB;`7@3J[^AB`\```4V"),D_P`+
- M````+'@`!$ZN_RX@'RYL!>1.=4S?!P-.=7!D8)A#^@`0<`!.KOW8*4`4U&?L,
- M3G5D;W,N;&EB<F%R>0```$Y5_YB_[`6H90`CXDCG`Q`N+P!\)F\`@&```)Q\0
- M`6```(8@:P`$T<80$$B`<C!=06L``)RP>Q`(9O1.^Q`$`'A@``!>`'9@``!.0
- M`'=@``!"`'5@```V`'1@```J`&%@```>`$9@```0`$)@```"&7P`/P`N8"X9$
- M?``O`"Y@)E*L$'I@(%*L$'Y@&E*L$()@%%*L$(9@#E*L$(I2K!".8`12K!".G
- M4H8@:P`$T<9*$&8`_W)3AUB+<`&^@&\,(&L`!'`ML!!G`/]6<`&^@&X22&P`A
- M[DZZ%O!(>``!3KHSH%!/80``\'`!*4`0=F`4("P0=N6`+S,(`&$``:Y83U*LR
- M$'8@+!!VL(=MY$JL$(YG$"\L$IYA``WX0I=.NC-B6$]*K!""9S)\`5B+8"0@>
- M;``V+P@O&R\(2&P!$DAM_YA.NBC42&W_F$ZZ(L)/[P`84H:\AVW84JP0>DJL=
- M$'IG!D'L`4)@!$'L`40O""\L`#9.NC"*4$\I0!*69A(O+``V3KHJ*DAX``%.K
- MNC+V4$\O+!*>80`-?"ZL$I9.NC*(6$]*K!""9R`@;``V+P@O"$AL`49(;?^8G
- M3KHH7DAM_YA.NB),3^\`%$*G3KHRMDSM",#_C$Y=3G5.5?_TO^P%J&4`(A!("
- MYP$0<``K0/_T<'YR`$'L!W`0P5'(__QP?D'L!O$0P5'(__QP?D'L!G(0P5'(C
- M__QP?D'L!?,0P5'(__QP?G(!0>P'[Q#!4<C__"9L`$!@#A`;2(!![`7S$;P`!
- M`0``2A-F[B9L`&1@#A`;2(!![`9R$;P``0``2A-F[B9L`.)@#A`;2(!![`;QF
- M$;P``0``2A-F[B9L`)Y@#A`;2(!![`=P$;P``0``2A-F[B9L`.I@#!`;2(!!/
- M[`?O0C```$H39O!,WPB`3EU.=;_L!:AE`"%`+PLF;P`(2&P!5"\+3KHO/%!/R
- M*4`2DF8,+PM.NBC>6$]@``$*+PMA`!$"*4`0<D*L"&Y(>``N+PMA`!$B3^\`0
- M#"9`(`MG:'!LL"L``69@2BL``F9:80`3>"\`2&P!5DZZ)<!03TJ`9Q8O+!*29
- M80`1'"ZL$I).NC#\6$]@``"P80`3VF$`"H9(>``!+RP(;DAL`5IA``"<80`3(
- MPF$``;HNK!*23KHPSD_O``Q@``"`(`MG)G!YL"L``68>2BL``F8880`3F&$`O
- M!]9A``&,+RP2DDZZ,*!83V!4(`MG0A`K``%R8[`!9SAR:+`!9S)**P`"9BPO.
- M+!*280`,P%A/2H!G#"\L$I).NC!L6$]@('``+P`O`"\L$I).NBQV3^\`#&$`-
- M`38O+!*23KHP2EA/)E].=4Y5_?R_[`6H90`@!$CG`#`F;P(42'@`'$ZZ*>A8[
- M3R1`(`IF+DAL`6!(;`-43KHMK"ZL$IYA``KX+JP2GF$`"?Y(>``<3KHIO$_O8
- M``PD0"E*$IY*K!".9EQ(;`&"+PM.NB0R4$]*@&9,2'@`+R\L$')A``^Z4$\F.
- M0$J`9@8F;!!R8`)2BR\+2&P!B$AM_?Q.NB6D2'@`+DAM_?QA``^03^\`%"9`3
- M(`MG"$HK``)F`D(31^W]_"\+80`/0EA/)(`E;!!R``05;0`3``@E;0`,``J1?
- MR"5(`!@E2``42JP0CF860BP0Q$AL`8Q(;!"23KHCQ%!/0BP0Q$AL$))A``[^*
- M6$\E0``.2JP2GF8(($HI2!*>8`PO+!*>+PIA``E,4$],WPP`3EU.=4Y5_=R_>
- M[`6H90`>WDCG(S)P`!E`!?(90`7Q?@!'[`AR1>P(<D'L"'(K2/_H4JP(;B\LS
- M$I(;0/_L&T#_[AM`_^T;0/_O3KHJ=EA/*4`2FB!L$I)3J``(;1HB;!*2(&D`;
- M!$WH``$B;!*2(TX`!'``$!!@"B\L$I).NAR06$\L`"!M_^@0@")L$I((*0`$,
- M`!MF``,N<`J\@&8(4JP(;F```?YP7+R`9E!#Z``!*TG_Z"!L$I)3J``(;1HB*
- M;!*2(&D`!$/H``$L;!*2+4D`!'``$!!@"B\L$I).NAPP6$\@;?_H$(`L`$B&Q
- M2,9P"KR`9@`!KGP@8``!J$HM_^]G9'`JO(!F``&:4JW_Z"!L$I)3J``(;1HB'
- M;!*2(&D`!$WH``$B;!*2(TX`!'``$!!@"B\L$I).NAO66$\L`"!M_^@0@'(J?
- ML`%GP'`*O(!F!%*L"&YP+[R`9@`!2'``&T#_[V```3Y*+?_N9Q)P(KR`9@#^=
- MXG``&T#_[F``_MA*+?_M9Q!P)[R`9@#^RD(M_^U@`/["(`9R,`1!``AK``$$K
- ML+L0"&;R3OL0!@```'U@``#&````>V```*H````C8```B@```"]@```F````D
- M)V```!0````B8````AM\``'_[F``_G(;?``!_^U@`/YH4JW_Z"!L$I)3J``(7
- M;1HB;!*2(&D`!$WH``$B;!*2(TX`!'``$!!@"B\L$I).NAKR6$\@;?_H$(!R-
- M*K`!9@H;?``!_^]@`/X@2(!(P"\L$I(O`$ZZ%4A03V``_@Q![`AR(FW_Z+/(3
- M9@#]_AE\``$%\6``_?1P`;"L`"IF!G("*4$`*E*'8`#]X$'L"'(B;?_HL\AF]
- M!'X`8`)3ATJ'9@#]R'`"L*P`*F8`_;YP`RE``"I@`/VT2H=F``#`2BW_[F8`K
- M`+A*+?_O9@``L!`L!?)F``"H2BW_[&<``(I![`9R2C!H`&=P("P(;DAM_>0OL
- M"B\+2&W_Z"]``"AA``#D3^\`$$J`9T8@"B(+D($D`%*"+P(O`4AM_>@O0``HS
- M3KH?>"`O`"A![?WIT<!"$&$`!:`NK?WD+R\`)$AM_>AA`/NV3^\`%"`M_>096
- M0`7R0BW_["9M_^A@)$'L!O%*,&@`9QI2BF`60>P'<$HP:`!G#"1M_^@F2AM\@
- M``'_['`[O(!F#'`#L*P`*F8$0JP`*E*M_^AP"KR`9PY![`YR(FW_Z+/(8P#\.
- MQD'L"'(K2/_H)D@D2"\L$I).NB<@6$\I0!*:<``90`7R&4`%\1M`_^P;0/_N(
- M&T#_[6``_)),WTS$3EU.=4Y5__:_[`6H90`;&$CG`S(F;P`J<`$@;0`4((`@;
- M;0`()%`<$GX`2BP%\69:8$A2BB!L$I)3J``(;1HB;!*2(&D`!$WH``$B;!*2F
- M(TX`!'``$!!@"B\L$I).NACH6$\L`!2&<`J\`&8.4JP(;D'L#G*UR&(``;P0:
- M!DB`0>P%\THP``!FJF`V2'@`!DAL`8XO"TZZ'DA/[P`,2H!F"'``&4`%\&`$H
- M4BP%\`PL``(%\&T,&7P``07R?@%@``%V2JP0?F<>2'@`!TAL`98O"TZZ'@Q/4
- M[P`,2H!F"'`!*4``*F#6<`&PK``J9D)(>``&2&P!GB\+3KH=YD_O``Q*@&>X=
- M2'@`!4AL`:8O"TZZ'=!/[P`,2H!GHDAX``1(;`&L+PM.NAVZ3^\`#$J`9XQPA
- M`;"L`"IF"G`#*4``*F``_WQP`["L`"IF"B!M`!1"D&```.1P*+P`9@#_8D(M"
- M__9@1'`*O`!F#E*L"&Y![`YRM<AB``#"$`9(@$'L!W!*,```9@9P+[P`9@92&
- M+?_V8!80!DB`0>P%\THP``!F"$HM__9G`/\84HH@;!*24Z@`"&T:(FP2DB!I^
- M``1-Z``!(FP2DB-.``1P`!`08`HO+!*23KH7=EA/+``4AG`IO`!F@F`2<`J\!
- M`&8,4JP(;D'L#G*UR&)"4HH@;!*24Z@`"&T:(FP2DB!I``1-Z``!(FP2DB-.B
- M``1P`!`08`HO+!*23KH7*%A/+``4AA`&2(!![`7S2C```&:L($I3B")M``@B^
- MB'`*O`!F!%.L"&X@!DB`2,`O+!*2+P!.NA%L4$]*AV8:(&T`%$J09PX0!DB`$
- M0>P'[THP``!G!'(!8`)R`"`!3-],P$Y=3G5.5?WRO^P%J&4`&)A(YP<P?@!A9
- M``):2'@``2\L"&Y(;`&R80#X<$_O``Q@``'*1^P(<F```;P0$TB`<DY=06L`1
- M`-"P>Q`(9O1.^Q`$`#M@``"Z`'Q@``"T`"5@``"6`'U@``"*`'M@``!^`"]@9
- M``!<`"=@``!"`")@```H``U@``%N``Q@``%H``E@``%B`"!@``%<``I@```"5
- M4JP(;F```4Y2BW`BL!-F^'!<L"O__V?P8``!.E*+<">P$V;X<%RP*___9_!@[
- M``$F4HMP*K`39@XO"V$``4)83R9`8``!$%.+8``!"E*'8``!!%.'8```_G`E%
- ML"L``68``/1![`ARM\AF``#J8``!"'P`8```X$J'9@``VDH&9@``U!`32(!(?
- MP'(#0>P$G<(P"`!F$!`3<BZP`6<(<E^P`68``+(D2U*+8`)2BQ`32(!(P'('G
- M0>P$G<(P"`!F[!`3<E^P`6?D<BZP`6?>(`LB"I"!*@!@`E*+$!-(@$C`0>P$5
- MG0@P``,(`&;L$!-R.K`!9PY*`&9<80`)H'(ZL(%F4B`%2(!(P"\`+PI(;?WR3
- M3KH:C!`%2(!![?WRT,!"$$AL"')(;!"23KH;5$AL$)).NALX0>P0D4(P"`!(&
- M>``!+RP(;DAM_?)A`/:R3^\`)'P!8`)3BU*+2A-F`/Y"+RP2DDAX"`!(;`ARK
- M3KHF;D_O``Q*@&8`_B!,WPS@3EU.=;_L!:AE`!:$+PLF;P`(8!`0*P`!4HMRB
- M+[`!9@0@"V`R2'@`*B\+3KH;1%!/)D!*@&;>1^P(<E*L"&XO+!*22'@(`$AL!
- M"').NB823^\`#$J`9LXF7TYUO^P%J&4`%BY(YP$0+RP2DDZZ(?8N`$*7+RP2=
- MFB\L$I).NB)B+JP2DDAX`@!(;!"23KHETDAX``I(;!"280`&%$_O`!PF0"`+`
- M9P)"$T*G+P<O+!*23KHB+D_O``Q,WPB`3G6_[`6H90`5S"\+)F\`"&`2+RL`U
- M&&'J+HM.NB*,6$\F:P`4(`MFZB9?3G6_[`6H90`5HDCG`3`F;P`0)&\`%"\2"
- M+Q-.NAH24$\N`$J'9F@@:P`$(FH`!+/(9BY*K!"&9@``C"\3+RP(;B\(2&P!-
- MNDAL`U1.NB,J2&P!Y$AL`U1.NB,>3^\`'&!D2BH`$F8@2JP0AF8:+Q,O*@`$<
- M+RL`!$AL`?I(;`-43KHB]D_O`!05?``!`!)@-DJ':AI*J@`49PXO*@`4+PMA>
- M`/]B4$]@'B5+`!1@&$JJ`!AG#B\J`!@O"V$`_TA03V`$)4L`&$S?#(!.=;_L^
- M!:AE`!3:2.<`,B9O`!`@"V<``4`O*P`48>183TJL$(YF``#<2BL`"&<``+@0U
- M+``N2(!(P"\`+RL`!"\32&P",B\L$I9.NB)D3^\`%"1K``Y@<'!<L!)F$$ALI
- M`CPO+!*63KHB2%!/8%@0+``N$A*R`&882(!(P"\`2&P"0"\L$I9.NB(H3^\`0
- M#&`V(&P2EE.H``QM&B)L$I8@:0`$0^@``2QL$I8M20`$$!(0@&`2$!)R`!(`7
- M+RP2EB\!3KH/IE!/4HI*$F:,$"P`+DB`2,`O`$AL`D0O+!*63KHAT$_O``Q@"
- M9B\K``HO*P`$+Q-(;`)(+RP2EDZZ(;1/[P`48$I*K!"*9R9P/]"K``IR0$ZZ/
- M)]`O`"\K``0O$TAL`E)(;`,R3KHAB$_O`!1@'B\K``XO*P`$+RL`"B\32&P":
- M7$AL`S).NB%H3^\`&"\K`!AA`/ZP6$],WTP`3G6_[`6H90`3@"\+)F\`"$*LC
- M$J)@``'&4JP(;D'L$)(I2`)P$"P0DG(EL`%F#D'L$),I2`)P8`12K`)P(&P"P
- M<!`02(!(P$'L!)T(,``#"`!FYB!L`G`0$&<``8)(@$C``$``('(H!$$`"&L`'
- M`.2PNQ`(9O).^Q`&````9&```(@```!C8```7@```&Q@``!"````<F```"(`-
- M``!I8````DAL`G1A``%66$]*@&<``*)A``&,8```FDAL`GQA``$^6$]*@&<`Y
- M`(IA``%T8```@DAL`H)A``$F6$]*@&=R80`!7F!L2&P"BF$``1)83TJ`9@Y(Y
- M;`*280`!!%A/2H!G4&$``3Q@2DAL`IQA``#P6$]*@&<\8`12K`)P(&P"<!`0_
- M2(!(P$'L!)T(,``#"`!FYB!L`G`0$&<``*1(;`*D80``O%A/2H!G``"48`12O
- MK`)P(&P"<!`02(!(P$'L!)T(,``#"`!FYB!L`G`0$&=N2(!(P`!``"`,@```8
- M`'!G.`R`````<V<<#(````!F9DY(;`*N80``:%A/2H!G0&$``29@.DAL`KAAM
- M``!46$]*@&<L80`!$F`F2&P"Q&$``$!83TJ`9P9A``#^8!)(;`+,80``+%A/2
- M2H!G!&$``.HO"TAX`@!(;!"23KHA<$_O``Q*@&8`_B8@+!*B)E].=;_L!:AE.
- M`!&&2.<!$"9O``Q^`&`$4HM2ATH39Q(@;`)PT<=PW\`0<M_"$[(`9^9*$V8(+
- MWZP"<'`!8`)P`$S?"(!.=;_L!:AE`!%$+PM@!%*L`G`@;`)P$!!(@$C`0>P$U
- MG0@P``,(`&;F(&P"<!`0<BJP`6900^@``2E)`G!@!%*L`G`@;`)P$!!(@$C`?
- M0>P$G-'`)D@(*P`#``%FX@@K``(``68&4ZP"<&`:4JP"<"!L`G`0$$B`2,!!W
- M[`2="#```@@`9N8F7TYU3E7]^K_L!:AE`!"Z+PM'[!"28`)2BTH39OI"*___Z
- M8`12K`)P(&P"<!`02(!(P$'L!)S1P"9(""L``P`!9N(@;`)P$!!*`&=@<`/`O
- M*P`!9UA'Z``!8`)2BTH39R`0$TB`2,!R`T'L!)W",`@`2@%FYD'L!)T(,``"-
- M"`!FVA`30A,O+`)P2&W]_!]```Q.NA2J%J\`#$AX``$O+`AN2&W]_&$`\!12T
- MK!*B)FW]]DY=3G5.5?_\O^P%J&4`$`HO+0`(3KH48E*`+H!.NAGN+JT`""\`,
- M+T``"$ZZ%&`@+P`(3EU.=;_L!:AE``_<2.<!,"9O`!`>+P`7E<H0$[`'9@(D.
- M2R!+4HM*$&;P(`I,WPR`3G6_[`6H90`/KDCG`1`F;P`,0JP2HF```-)2K`AN*
- M0>P0DBE(`G`0+!"2<BBP`68``+H0+!"3<D2P`6<(<F2P`68``*@0+!"4<D6P,
- M`6<(<F6P`68``)80+!"5<D:P`6<(<F:P`68``(1![!"6*4@"<$AL`M8O"&$`Z
- M`5903TJ`9R1(;`+>+RP"<&$``4103TJ`9Q)(;`+F+RP"<&$``3)03TJ`9@1^"
- M`6`(?@!@!%*L`G`@;`)P$!!(@$C`0>P$G0@P``,(`&?F8`12K`)P(&P"<!`0Y
- M2(!(P$'L!)T(,``#"`!FYB\'80``(EA/+PM(>`(`2&P0DDZZ'I!/[P`,2H!F/
- M`/\:3-\(@$YU3E7]^K_L!:AE``ZD+PM'[!"28`)2BTH39OIP`!=`__\@;`)PF
- M$A!*`6<``)1*K0`(9T1(>``I+PA.NA-64$\F0$J`9@1@>%.+M^P"<&4&<#JPL
- M$V;RM^P"<&5D*4L"<&`"4HM*$V<L$!-R*;`!9R1R(+`!9NQ@'"9L`G!2BV`"L
- M4HM*$V<.$!-R*+`!9P9R(+`!9NP0$T(3+RP"<$AM_?P?0``,3KH2?A:O``Q(N
- M>``!+RP(;DAM_?QA`.WH4JP2HB9M_?9.74YUO^P%J&4`#>)(YP$P)F\`$"1O8
- M`!1@5A`32(!(P$'L!)T(,```"`!G(D'L!)T(,```"`!G#!`32(!(P'(@T(%@+
- M!A`32(!(P"X`8`8>$TB'2,<0$DB`2,"PAV<.$!)(@$C`(@>2@"`!8`I2BE*+K
- M2A)FIG``3-\,@$YUO^P%J&4`#6I(YP,@+RP2DDZZ&3)83RX`8"9![`2="#``+
- M`V@`9AIP#;R`9Q1"IR\'+RP2DDZZ&8I/[P`,(`9@1B!L$I)3J``(;1HB;!*2J
- M(&D`!$7H``$B;!*2(TH`!'``$!!@"B\L$I).N@LF6$\L`%*`9J9"IR\'+RP2-
- MDDZZ&4)/[P`,</],WP3`3G5.5?X`O^P%J&4`#-HO+!*23KH8IBE`$IHNK!*2\
- M2'@"`$AM_@!.NAR.3^\`#$J`9QQ2K`AN2'@``DAL`NY(;?X`3KH06D_O``Q*1
- M@&;`3EU.=4YU3G5(YP<P+B\`&"9O`!PL+P`@+P=.NB*T6$\D0"`*9@1P_V`V9
- M""H``P`#9Q!(>``"0J<O!TZZ%J!/[P`,+P8O"R\J``1.NATP3^\`#"H`2JP%H
- MO&<$</]@`B`%3-\,X$YU``````````!P84CG`Q`F;P`0($M*&&;\4XB1RRP()
- M?@`>&TJ'9S)3K`,^;18@;`,V0^@``2E)`S8@!Q"`<@`2`<(`=R`!(`2&P#9
- M,B\!3KH'9E!/(@!@QDAL`S)(>/__3KH'5%!/(`9,WPC`3G4```````!P84Y5W
- M_\1(YR<P)F\`7"1O`&!^`'P`>@!P`!M\`"#_^W(`*T'_]G3_*T+_\D'M_]`;^
- M0/_Q&T#__"M!_^0K0?_H*TC_S$H39T)P`!`3<AA=06LXL'L0"&;V3OL0!``CI
- M8```(``@8```%@`K8```#``M8````GX!8`Y\`6`*>@%@!AM\``'__%*+8+H0+
- M$W(PL`%F!E*+&T'_^W`JL!-F$"!20^@`!"2)*U#_]E*+8`Y(;?_V+PM.NA#(E
- M4$_7P!`3<BZP`68F4HMP*K`39A`@4D/H``0DB2M0__)2BV`.2&W_\B\+3KH0C
- MFE!/U\`0$W)LL`%F"AM\``'_\5*+8`AR:+`!9@)2BQ`;<@`2`!M`__!P,%U`%
- M:P`"5+)[``AF]$[[``0`8V```BH`<V```>@`6&```7X`>&```7@`<&```5X`_
- M;V```0P`=6```.(`9&````)*+?_Q9PP@4D/H``0DB2`08`H@4D/H``0DB2`09
- M*T#_[&P*<@%$K?_L*T'_Z$JM_^AG!'`M8`I*!F<$<"M@`G`@&T#_T'``$`8B8
- M+?_H@H!P`!`%@H!G"%*M_\Q2K?_D+RW_["\M_\Q.N@\J4$\K0/_(("W_\DJ``
- M:@9R`2M!__(@+?_((BW_\I*`2.T``O_$;RX@;?_,(DC3P6`"$MA3@&3Z<``00
- M+?_[(BW_Q"!M_\Q@`A#`4X%D^B`M__(K0/_(T:W_Y$'M_]`K2/_,2@=G``%0*
- M&WP`(/_[8``!1DHM__%G#"!20^@`!"2)(!!@"B!20^@`!"2)(!`K0/_L8`#_-
- M8DHM__%G#"!20^@`!"2)(!!@"B!20^@`!"2)(!`K0/_L2BW__&<2(&W_S!#\'
- M`#!R`2M!_^0K2/_,+P`O+?_,3KH.A%!/*T#_R&``_R@;?``P__L@+?_R2H!JK
- M!G`(*T#_\DHM__%G#"!20^@`!"2)(!!@"B!20^@`!"2)(!`K0/_L2BW__&<6?
- M(&W_S!#\`#`0_`!X<@(K0?_D*TC_S"\`+RW_S$ZZ#F!03RM`_\AP6+`M__!FP
- M`/Z^2&W_T$ZZ#`183V``_K`@4D/H``0DB2)0*TG_S&8(0?H`W"M(_\P@;?_,G
- M2AAF_%.(D>W_S"M(_^0@+?_R2H!K*K'`;R8K0/_D8"!P`2M`_^0@4D/H``0DS
- MB2`0&T#_T$(M_]%@!G``8```C"`M_^0B+?_VLH!L"'0`*T+_]F`$D:W_]DH'\
- M9S93K?_D;1AP`"!M_\P0&"\`*TC_S"!M`!!.D%A/8.)3K?_V;4AP`!`M__LO&
- M`"!M`!!.D%A/8.A3K?_V;1)P`!`M__LO`"!M`!!.D%A/8.A3K?_D;1AP`"!M#
- M_\P0&"\`*TC_S"!M`!!.D%A/8.(@"TS?#.1.74YU``!.5?_V2.<!,"9O`!XD'
- M;P`B*VT`$/_V'AI*!V<T<"6^`&8BL!)F!%**8!HO"TAM__8O"F$`^\Q/[P`,^
- M*T#_^F<$)$!@TG``$`<O`$Z36$]@QDS?#(!.74YU2.<A$"XO`!`F;P`4</^^1
- M@&=@""L````;9UAR,,*K`!A*@69.""L``@`;9Q@B!Q=!`"!!ZP`@)T@`!'0!>
- M)T(`""`!8"X@:P`$(FL`$+/(9@1P_V`>4ZL`!"!K``0@!Q"`""L`!P`:9P93Z
- MJP`(8`12JP`(3-\(A$YU3E7_\$CG(3(F;P`L#*P````@%")L``"&$!-R(+`!1
- M9PQR";`!9P9R"K`!9@12BV#H2A-G:"`L%"+E@%*L%")![!0JT<`D2'`BL!-FR
- M)E*+)(M*$V<*<"*P$V<$4HM@\DH39@Q(>``!3KH&+%A/8)Y"&V":)(M*$V<8`
- M$!-R(+`!9Q!R";`!9PIR"K`!9P12BV#D2A-F`F`&0AM@`/]R2JP4(F8&(&P%U
- MX&`$0>P4*BE(%"9*K!0B9GQ!^@$D0^P3Z"+8(M@BV"+8,I`B;`7@(&D`)$AX\
- M`"@O*``$2&P3Z$ZZ"A9/[P`,0>P3Z"(()#P```/N+&P4U$ZN_^(I0!*L*4`2&
- MM'($*4$2L"E`$KPI01*XY8"3R2QX``0K0/_P3J[^VB!M__`B0"-H``@`I'X`K
- M*T#_]&`J+&P4U$ZN_\HI0!*L3J[_Q"E`$K1!^@"F(@@D/````^U.KO_B*4`2U
- MO'X$(`<`0(`!@:P2J"`'`$"``H&L$K``K```@`,2N$JL`WAG!'``8`8@/```L
- M@``N`$*L`RP@!P!```$I0`,H<`$I0`-.(`<`0``"*4`#2G`"*4`#<"`'`$``&
- M@"E``VQ!^AGV*4@%U"\L%"8O+!0B3KKA-D*73KH5K$SM3(3_W$Y=3G5C;VXZ?
- M,3`O,3`O,S(P+S@P+P`J````````````````````````````````````````E
- M`'!A+PLF;P`(2JL`%&<,""L``P`;9@1P`&`V+RP%H$ZZ$'Y83R=```0G0``0$
- M2H!F"G`,*4`4T'#_8!8G;`6@`!1P\\&K`!AP`"=```PG0``()E].=0``````U
- M````````````3E7_[$CG+Q`N+P`T)F\`."@'<#'`JP`89P9P_V```G`(*P`'5
- M`!I6P$0`2(!(P"P`2JL`%&8``(0(*P`"`!MF>G``)T``#'+_OH%G``)"+PM.9
- MNO].6$]*@&<,".L`!0`;</]@``(J".L``0`;2@9G#B`K`!0B`$2!)T$`#&`(O
- M("L`%"=```Q3JP`,;18@:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO/
- M`6$`_U)03R(`(`%@``'6""L``@`;9UAP_[Z`9@9P`&```<(@!QM`__]*!F<B@
- M<@J^@68<<@(O`4AZ`;(O*P`<*T'_\$ZZ]OQ/[P`,*@!@&G(!+P%(;?__+RL`_
- M'"M!__!.NO;@3^\`#"H`?O]@``#@".L``0`;2@9G4G#_OH!G3%2K``QR"KZ!$
- M9B8@:P`$0^@``2=)``00O``-(BL`#$J!:PHO"R\`80#^KE!/4JL`#"!K``1#=
- MZ``!)TD`!"`'$(`B*P`,2H%K``$<?O\@*P`$D*L`$"M`__!G<@@K``8`&F=26
- M2'@``D*G+RL`'$ZZ#2A/[P`,*T#_[$H&9SA3K?_L;3)"IR\M_^PO*P`<3KH-R
- M"$AX``%(;?_]+RL`'$ZZ"BA/[P`82JP%O&8*$"W__7(:L`%GR"\M__`O*P`0!
- M+RL`'$ZZ]@!/[P`,*@!@`GH`</^Z@&8(".L`!0`;8`RZK?_P9P8(ZP`$`!M*Y
- M!F<.(BL`%"0!1((G0@`,8!@(*P`"`!MG"'(`)T$`#&`((BL`%"=!``P@:P`0Q
- M)T@`!+Z`9RY3JP`,;18@:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO#
- M`6$`_9!03R(`<##`JP`89P1P_V`,</^X@&8$<`!@`B`$3-\(]$Y=3G4-"@``,
- M``!(YP<0)F\`%`@K``<`&E;`1`!(@$C`+@!P,,"K`!AG"D*K``AP_V```5@(4
- M*P`'`!MG%`@K``8`&V<,+PM(>/__3KK](E!/2JL`%&8V0JL`"`@K``(`&V<2P
- M<`$G0``40>L`("=(`!!@``"$+PM.NOR66$]*@&=V".L`!0`;</]@``$`2@=G8
- M9E2K``@@*P`(2H!N6B!K``1#Z``!)TD`!'P`'!`@!@R`````&F<N#(`````-C
- M9C)3JP`(;10@:P`$0^@``2=)``1P`!`08```M"\+80#_+EA/8```J`CK``0`@
- M&W#_8```G"`&8```E@@K``$`&V9.".L````;+RL`%"\K`!`O*P`<3KH(3$_O;
- M``PJ`$J%:@8(ZP`%`!M*A68&".L`!``;2H5O&DH'9PH@!42`)T``"&`$)T4`7
- M""!K`!`G2``$<#+`JP`89Q9*!V<(</\G0``(8`9P`"=```AP_V`@4ZL`"&T2/
- M(&L`!$/H``$G20`$<``0$&`(+PMA`/Z$6$],WPC@3G4``$CG!P`N+P`0+"P"^
- M]$I&:S`@!DC`YX!![!*H*C`(`$H%9QH(!0`"9A0@!DC`YX!![!*H+S`(!$ZZ%
- M$RQ83U-&8,PO!TZZVYQ83TS?`.!.=0``````````<&$N;`7D3KH3)DAY````K
- M%$ZZ$(```````````'!A2.<W$"9O`!QZ`"QL%-1.KO_$+@!*AV840?H`3"(('
- M)#P```/N3J[_XBX`>@$B"W0`)@=.KO\B+`!*A6<&(@=.KO_<2H9F%G#_*4`4B
- MT"QL%-1.KO]\*4`%O'#_8`1.KO]\3-\([$YU3DE,.@``56YK;F]W;B!E<G)O"
- M<B!C;V1E``!5<V5R(&ES(&YO="!O=VYE<@!.;R!S=6-H(&9I;&4@;W(@9&ERT
- M96-T;W)Y`$YO('-U8V@@<')O8V5S<P!);G1E<G)U<'1E9"!S>7-T96T@8V%LP
- M;`!)+T\@97)R;W(`3F\@<W5C:"!D979I8V4@;W(@861D<F5S<P!!<F<@;&ESF
- M="!I<R!T;V\@;&]N9P``17AE8R!F;W)M870@97)R;W(`0F%D(&9I;&4@;G5MA
- M8F5R`$YO(&-H:6QD('!R;V-E<W,``$YO(&UO<F4@<')O8V5S<V5S(&%L;&]W_
- M960`3F\@;65M;W)Y(&%V86EL86)L90!!8V-E<W,@9&5N:65D`$)A9"!A9&1R=
- M97-S`$)U;&L@9&5V:6-E(')E<75I<F5D``!297-O=7)C92!I<R!B=7-Y``!&7
- M:6QE(&%L<F5A9'D@97AI<W1S`$-R;W-S+61E=FEC92!L:6YK`$YO('-U8V@@A
- M9&5V:6-E``!.;W0@82!D:7)E8W1O<GD`27,@82!D:7)E8W1O<GD``$EN=F%L#
- M:60@87)G=6UE;G0``$YO(&UO<F4@9FEL97,@*'5N:71S*2!A;&QO=V5D`$YO\
- M(&UO<F4@9FEL97,@*'5N:71S*2!A;&QO=V5D(&9O<B!T:&ES('!R;V-E<W,`0
- M`$YO="!A('1E<FUI;F%L``!497AT(&9I;&4@:7,@8G5S>0!&:6QE(&ES('1OQ
- M;R!L87)G90!.;R!S<&%C92!L969T`%-E96L@:7-S=65D('1O('!I<&4`4F5AL
- M9"UO;FQY(&9I;&4@<WES=&5M`%1O;R!M86YY(&QI;FMS``!"<F]K96X@<&EPJ
- M90!-871H(&9U;F-T:6]N(&%R9W5M96YT(&5R<F]R``!-871H(&9U;F-T:6]N2
- M(')E<W5L="!I<R!O=70@;V8@<F%N9V4``$CG(#`F;P`0)$M*$F<D<``0$D'L.
- M!)T(,``!"`!G"G(`$@!T()*"8`1R`!(`%(%2BF#8(`M,WPP$3G4`````````Y
- M`'!A(F\`""!O``0@+P`,(@A@!!#99PA3@&3X8`9"&%.`9/H@`4YU2.<#,"9OY
- M`!0D;P`8+B\`'$J'9R!*$V<<2A)G&'``$!MR`!(:D($L`$J&9P0@!F`:4X=@6
- MW$J'9Q!*$V<$<`%@"DH29P1P_V`"<`!,WPS`3G5.5?_X2.<#,"9O`"`D;P`DQ
- M+B\`*"!*2AAF_%.(D<HL""!+2AAF_%.(D<L@"")+T\`K2?_XO(=C`BP'(`8@W
- M2F`"$MA3@&3Z(&W_^$(P:``@"TS?#,!.74YU(&\`!"`(2AAF_%-(D<`@"$YU+
- M```@;P`((F\`!"`)$MAF_$YU(&\`!")O``@2&+(99@A*`6;V<`!.=6X$</].\
- M=7`!3G4B;P`((&\`!"`(2AAF_%.($-EF_$YU``!(YP$0)F\`#"XO`!!P`!`3+
- ML(=F!"`+8`@0&TH`9NYP`$S?"(!.=4CG`1`F;P`,+B\`$"\'+PMAR%!/3-\(<
- M@$YU2.<!,"9O`!`N+P`4E<I*$V<.<``0$["'9@(D2U*+8.X@"DS?#(!.=2`OI
- M``@@;P`$3E7_]")/<@I.N@[\!D$`,!+!2H!F\"`)$.&_R6;Z0A"0CTY=3G4`[
- M`"`O``@@;P`$3E7_]")/(@`"00`'!D$`,!+!YHAF\"`)$.&_R6;Z0A"0CTY=)
- M3G4``#`Q,C,T-38W.#EA8F-D968@+P`((&\`!$/O``0R``)!``\2^Q#<Z(AF8
- M\B`)(@]8@1#ALHEF^D(0D(%.=2!O``0B2'(`<``O`@P0`"MG!@P0`"UF`E)(F
- M$!@$```P;1(,```);@PD`>6!TH+2@=*`8.8,$0`M9@)$@20?(`A3@"!O``@@@
- M@9")3G4O!RXO``A2K!2P(`<@;!2L$,`I2!2L+A].=4Y5``!(YP`P)F\`$"1OX
- M`!1"K!2P*4L4K$AM`!`O"DAZ_\9.NO'Z(&P4K$(0("P4L$SM#`#_^$Y=3G5.8
- M5?_H2.<!,BXO`#1*AVX&</]@``#2<`B^@&0"+@`@!U:`+@`"1__\)&T`""!MT
- M``C1Q]^L`PA#[`,$)E$K2/_P*TG_]"`+9P``D"!+("L`!-'`*TC_[")M__"WL
- MR6,0)(LE1P`$+&W_]"R*<`!@>+?)9AHL4R2.("L`!"(`TH<E00`$+&W_]"R*,
- M<`!@6K7(9`B?K`,(</]@3K7(9BQ*DV<.(%.SR&,(GZP#"'#_8#C?JP`$2I-GO
- M#K/39@H@*0`$T:L`!":1<`!@'BM+__0K;?_L_^@F4V``_VX@;?_T((I"DB5'Y
- M``1P`$S?3(!.74YU``````````!P84CG`1`F;P`,+B\`$"\'+PM.NO[V4$],/
- MWPB`3G5(YP<P+B\`&"9O`!PL+P`@+P=.N@ZP6$\D0"`*9@1P_V`>+P8O"R\J!
- M``1.N@H,3^\`#"H`2JP%O&<$</]@`B`%3-\,X$YU``!(YP$0)F\`#$JL%-!GJ
- M6"`L%-"PK`-\;@)L!'X`8`(N`$AL`U1(>``*3KH%1DAL`U0O"TZZ!0Q(;`-4B
- M2'H`-$ZZ!0`@!^6`2&P#5$'L`X`O,`@`3KH$[$AL`U1(>``*3KH%$$_O`"@@A
- M+!303-\(@$YU.B```````````````````$Y5_^9(YP\P)F\`.BXO`#Y"+?__M
- M0JP%O"ML%-#_\GH#NJP"]&P2(`7G@$'L$JA*L`@`9P12A6#H("P"]+"%9@QP*
- M&"E`%-!P_V```2H@!>>`0>P2J-'`)$A*K0`09P@(+0`"`!-G"BM\```#[/_N#
- M8`@K?````^[_[B`\``"``,"L`PRQAP@'``-G#"`'`D#__"X``$<``B`'<@/`X
- M@0R``````F<,#(`````!9P1*@&8&+`=2AF`,<!8I0!30</]@``"T(`<"@```F
- M`P!G``"("`<`"F<6&WP``?__+RW_[B\+3KH)(E!/*`!@/`@'``EF%DAX`^TOJ
- M"TZZ",103R@`2H1J!`C'``D(!P`)9QH;?``!__\I;?_R%-`O+?_N+PM.N@E(P
- M4$\H`$HM__]G-B`'<GC2@<"!2H!G*DJ$:R8O!$ZZ"9!(>`/M+PM.N@AR3^\`V
- M#"@`8`Y(>`/M+PM.N@A@4$\H`$JL!;QG!'#_8`@DAB5$``0@!4S?#/!.74YU-
- M````````````````2.<`,B9L%+0@"V<4)%,B2R`K``@L>``$3J[_+B9*8.B1R
- MR"E(%+@I2!2T3-],`$YU2.<!,"XO`!!*K!3`9Q8D;!3`+Q(O+!3`3KK]2E!/.
- MD<@I2!3`2H=F!'``8!Y8AR\'3KH!FEA/)D!*@&8$<`!@"B1+)(=!ZP`$(`A,8
- MWPR`3G5(YP\0+B\`&"PO`!PJ+P`@+P=.N@O@6$\F0"`+9@1P_V`>+P4O!B\K<
- M``1.N@;`3^\`#"@`2JP%O&<$</]@`B`$3-\(\$YU``!(YP$R+B\`%'`,WH`@.
- M!W(`+'@`!$ZN_SHF0"`+9@1P`&`Z)T<`"$7L%+0@:@`$)T@`!)'()HA*DF8"6
- M)(M*J@`$9P8B:@`$(HLE2P`$2JP"^&8$*4L"^$'K``P@"$S?3(!.=0``````G
- M````````````2.<#,"XO`!1*AVX&<`!@``"D<`B^@&0"+@`@!U:`+@`"1__\%
- M1>P#!"92(`MG0"`K``2PAVTRL(=F#"!3)(B?K`,((`M@;B`K``20AW((L(%ET
- M%B!+T<<DB"1()),E0``$GZP#""`+8$PD2R938+P@!R(L!`S0@5.`3KH(BB(L3
- M!`Q.N@AB+`!0AB`&5H`L``)&__PO!DZZ_OI83R9`(`MG$B\&+PM.NOJ^+H=A:
- M`/]44$]@`G``3-\,P$YU``````````!P82\'+B\`""\'3KK_,EA/+A].=0``0
- M2.<!$"9O``P(*P`!`!MG%DJK`!1F!'``8%PO"TAX__].NN^.4$](>``!0J<O!
- M*P`<3KK^/D_O``PN`'#_OH!G!DJK`!1F!"`'8"P(*P`!`!MG#"`K``20JP`0?
- MT(=@&`@K``<`&F<*(`<B*P`(T(%@!B`'D*L`"$S?"(!.=4CG`Q`F;P`0+B\`K
- M%"PO`!@(*P`!`!MG#B\+2'C__TZZ[Q103V`:<`&\@&84""L`!P`:9P@@*P`(D
- MWH!@!)ZK``@G:P`0``1P`"=```PG0``(""L`!P`;9P9P_,&K`!@O!B\'+RL`"
- M'$ZZ_8Q/[P`,4H!F!'#_8`APS\&K`!AP`$S?",!.=2\+)F\`""`+9Q!"ITZZ=
- M_1)83R!+68@I2!3`<``F7TYU````````<&%(YP$P)F\`$"1O`!1^`!X;2H=GK
- M$B\*+P=.N@`64$]2@&;J</]@`G``3-\,@$YU``!(YP$0+B\`#"9O`!`(*P`&B
- M`!MG$G`*OH!F#"\++P=.NNXX4$]@,%.K``QM%B!K``1#Z``!)TD`!"`'$(!RP
- M`!(`8!(@!W(`$@`O"R\!3KKN"E!/(@`@`4S?"(!.=4CG`2`N+P`,4JP4S"!L4
- M%,A3J``,;18B:``$1>D``2%*``0@!Q*`<@`2`&`2(`=R`!(`+P@O`4ZZ[<10<
- M3R(`3-\$@$YU3E4``$CG`#`F;P`0)&\`%$*L%,PI2Q3(2&T`$"\*2'K_G$ZZR
- MZE0NBTAX__].NNV*("P4S$SM#`#_^$Y=3G4``$Y5__A(YP`P1^P#$"`+9PQ*Q
- MJP`89P8D2R938/`@"V8B2'@`(DZZ_8Y83R9`2H!F!'``8!PDBW`A<@`@2Q#!K
- M4<C__"\++RT`#"\M``A.N@`.3.T,`/_P3EU.=0``3E7_\$CG#S`F;P`T)&\`N
- M.$JJ`!AG""\*3KH!LEA/*BP#>'X!<``0,W@`#$``8F<*#$``868,>@!@!BH\-
- M``"``%*'<BNR,W@`5\!$`$B`2,`H`'``$!,,0`!W9P``B`Q``')G0@Q``&%FE
- M``"^2'@`#"\\``"!`B\M``A.NOE83^\`#"P`</^\@&8&<`!@``#02H1G!G!`-
- MT(!@`G`"+@``1T``8```B$J$9P1P`F`"<```0(``2'@`#"\`+RT`"$ZZ^11/!
- M[P`,+`!P_[R`9@9P`&```(Q*A&<&<$#0@&`"<`$N`&!(2H1G!'`"8`)P`0!`\
- M@```0`$``$`"`$AX``PO`"\M``A.NOC.3^\`#"P`</^\@&8$<`!@1DJ$9P9P\
- M0-"`8`)P`BX`8`1P`&`RD<@E2``0<``E0``4)48`'"5J`!``!"5```PE0``(_
- M2H5F!B`\``"``"('@H`E00`8(`I,WPSP3EU.=0``2.</,"9O`!PN+P`@)&\`N
- M)"@+4X<L!TJ&:S13J@`(;1(@:@`$0^@``25)``1P`!`08`@O"DZZ[AI83RH`5
- M</^Z@&<,4X8@!1;`<@JZ@6;(0A.\AV8$<`!@!"!$(`A,WPSP3G4``$CG`S`FI
- M;P`4""L``0`;9Q`O"TAX__].NNLX4$\N`&`"?@`@*P`80H!G%$JK`!1G#B\K1
- M`!0O*P`03KKVZE!/+RL`'$ZZ!7A83RP`</^^@&<&2H9F`G``3-\,P$YU2.<#!
- M$"XO`!!'[`,0(`MG-`@K``(`&V8H""L``0`;9R`@*P`$D*L`$"P`2H9G$B\&!
- M+RL`$"\K`!Q.NN*F3^\`#"938,@O!TZZ[M!83TS?",!.=0``2.<W$"XO`!PF)
- M;P`@+"\`)$JL!=1G!$ZZ!7Q"K`6\(@<D"R8&+&P4U$ZN_]`J`'#_NH!F#DZN2
- M_WPI0`6\<`4I0!30(`5,WPCL3G4``$CG/P`N+P`<+"\`("HO`"1*K`749P1.5
- MN@4P0JP%O"`%4X`B!R0&)@`L;!343J[_OB@`</^X@&8.3J[_?"E`!;QP%BE`;
- M%-`@!0R``````F<6#(`````!9PA*@&88(`9@%"`$T(9@#B('=`!V`"QL%-1.[
- MKO^^3-\`_$YU``!(YS<0+B\`'"9O`"`L+P`D2JP%U&<$3KH$M$*L!;PB!R0+Y
- M)@8L;!343J[_UBH`</^Z@&8.3J[_?"E`!;QP!2E`%-`@!4S?".Q.=0``2.<C`
- M$"9O`!0N+P`82JP%U&<$3KH$;$*L!;PB"R0'+&P4U$ZN_^(L`$J&9A).KO]\O
- M*4`%O'`"*4`4T'#_8`(@!DS?",1.=0``3E7__$CG(1`F;P`82JP%U&<$3KH$+
- M)$*L!;PB"W3^+&P4U$ZN_ZPN`$J'9PHB!TZN_Z9P_V`F(@LD/````^Y.KO_BC
- M+@!*AV823J[_?"E`!;QP`BE`%-!P_V`"(`=,WPB$3EU.=4Y5__Q(YR$0)F\`'
- M&$JL!=1G!$ZZ`\!"K`6\(@MT_BQL%-1.KO^L+@!*AV<,(@=.KO^F(@M.KO^XN
- M(@LD/````^Y.KO_B+@!*AV823J[_?"E`!;QP`BE`%-!P_V`"(`=,WPB$3EU.:
- M=0``+P<N+P`(2JP%U&<$3KH#7B('+&P4U$ZN_]QP`"X?3G5.5?^P+PY*K!3$0
- M9A)#^@"(<``L>``$3J[]V"E`%,1P`"!L!>P0*/__0^W_L&`"$MA3@&3Z<``@V
- M;`7L$"C__T(U"+!![?^P*4@$'$AX`"A(>`#Z<``O`"\`2&P$.'(`+P%(;`0D.
- M+P%.N@,T2'@`%$ZZ[`PL;?^L3EU.=2HJ(%-T86-K($]V97)F;&]W("HJ``!%,
- M6$E4``!I;G1U:71I;VXN;&EB<F%R>0````````````````!(YS``)``F`4A"O
- M2$/$P<;`P,'40TA"0D+0@DS?``Q.=4J`:@``'D2`2H%J```,1(%A```@1(%.X
- M=6$``!A$@$2!3G5*@6H```Q$@6$```9$@$YU+P)(030!9@``(DA`2$%(0C0`T
- M9P``!H3!,`)(0#0`A,$P`DA",@(D'TYU+P-V$`Q!`(!D```&X9E10PQ!"`!D1
- M```&Z9E90PQ!(`!D```&Y9E50TI!:P``!N.94T,T`.:H2$)"0N:J2$.`P38`!
- M,`(T`TA!Q,&0@F0```A30]"!9/YR`#(#2$/GN$A`P4$F'R0?3G5.5?^>2.<S&
- M,GX`(&P%[!XH__]P3[Z`;P(N`"`'0^W_KV`"$MA3@&3Z0C5XKY/)+'@`!$ZNM
- M_MHF0$JK`*QG3"`K`*SE@"1`+"H`.$J&9@0L*P"@2H9G-"(&0?H`LB0(=@LLJ
- M;!343J[_T"!'4H<@"!N\``H(KR(&0>W_KR0()@<L;!343J[_T'#_8$Y*K!3$R
- M9A)#^@"&<``L>``$3J[]V"E`%,1![?^O*4@$;$AX`#Q(>`#Z<``O`"\`2&P$>
- MB$AL!'1(;`1@0J=.N@$\3^\`(%.`9P1P_V`"<`!,WTS,3EU.=2HJ(%5S97(@[
- M06)O<G0@4F5Q=65S=&5D("HJ``!#3TY424Y510``04)/4E0`*BHJ($)R96%K>
- M.B``:6YT=6ET:6]N+FQI8G)A<GD```!(YP$0+B\`#"\'3KH`/%A/)D`@"V8$E
- M</]@*`@K``(``V<&<``F@&`:+RL`!$ZZ_.Y83W``)H!*K`6\9P1P_V`"<`!,H
- MWPB`3G4O!RXO``AP`"E`!;Q*AVLBOJP"]&P<(`?G@$'L$JA*L`@`9PX@!^>`?
- M0>P2J-'`(`A@"'`)*4`4T'``+A].=0``2.<!`G``(CP``#``+'@`!$ZN_LXN<
- M``*'```P`$J'9@1P`&`@2JP%U&<8(&P%U$Z02H!F!'``8`Q(>``43KKH\EA/B
- M(`=,WT"`3G5AM$YU``!(YS`R+&P4Q"!O`!@B;P`<)&\`("9O`"0@+P`H(B\`V
- M+"0O`#`F+P`T3J[^I$S?3`Q.=0`````#[`````$````!````!@````````/R(
- M```#Z@```79`*",I8W1A9W,N8PDT+C<@*$)E<FME;&5Y*2`X+S$X+S@S````+
- M``````$`````+P!T86=S```````P(`P)"@``````.B`)"B(G(R@I6UU[?3TM2
- M*R4J+R9\7GXA/#X[+"XZ/P``````1$%"0T1%1D=(24I+3$U.3U!14E-45597H
- M6%E:7V%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ`````&A!0D-$149'2$E*H
- M2TQ-3D]045)35%565UA96E]A8F-D969G:&EJ:VQM;F]P<7)S='5V=WAY>C`Q'
- M,C,T-38W.#D`````HBP[``````#F57-A9V4Z(&-T86=S(%LM0D9A='5W=GA=X
- M(&9I;&4@+BXN"@``;78@)7,@3U1!1U,[9F=R97`@+78@)PDE<PDG($]404=3U
- M(#XE<SMR;2!/5$%'4P``80!W`'-O<G0@)7,@+6\@)7,`<@`[*%L`>7EL97@`E
- M8W1A9W,Z('1O;R!M86YY(&5N=')I97,@=&\@<V]R=`H``&UA:6X``$TE<P`D0
- M`&1E9FEN90``='EP961E9@!S=')U8W0``'5N:6]N`&5N=6T``'EY<&%R<V4`L
- M1'5P;&EC871E(&5N=')Y(&EN(&9I;&4@)7,L(&QI;F4@)60Z("5S"@``4V5C0
- M;VYD(&5N=')Y(&EG;F]R960*`$1U<&QI8V%T92!E;G1R>2!I;B!F:6QE<R`E!
- M<R!A;F0@)7,Z("5S("A787)N:6YG(&]N;'DI"@``)7,))7,))6->`%Q<``!<?
- M)6,`)6,*`"5S"25S"25D"@`E<R`E<R`E9`H`)2TQ-G,E-&0@)2TQ-G,@)7,*I
- M`````!"2:6YT96=E<@!R96%L``!L;V=I8V%L`&-O;7!L97@`8VAA<F%C=&5RT
- M`&1O=6)L90``<')E8VES:6]N`&9U;F-T:6]N``!S=6)R;W5T:6YE``!P<F]GU
- M<F%M`'!R;V-E9'5R90!M971H;V0``'=R87!P97(`=VAO<'!E<@`E)0``````:
- M```H`````````````````````````````(`````#,@``````````````````=
- M`````````````````````````U0`````````````````````````````````7
- M`````````````````````````````````````````````````````````(```
- M````(@``)GP``":0```FH@``)KP``";,```FY```)NX``"<(```G'@``)S``_
- M`"=````G4@``)VP``">````GC@``)YH``">P```GP@``)]8``"?H```G^```[
- M*`@``"@8```H*@``*$@``"AX```HB```*)H``"BL```HN@``*,X``"CD```HD
- M]```*0```"D>```$`/__````#@`.````````````````__\````$``0`````(
- M```YF@``!!#__P````0`!````````#FP`````/__````#@`.````````.Y@`#
- M````__\````$``0`````````````!$S__P````0`!````````#NT`````/__)
- M````!``$````````.[X``````"`@("`@("`@("@H*"@H("`@("`@("`@("`@I
- M("`@("`@2!`0$!`0$!`0$!`0$!`0$(2$A(2$A(2$A(00$!`0$!`0@8&!@8&!6
- M`0$!`0$!`0$!`0$!`0$!`0$!`0$0$!`0$!""@H*"@H("`@("`@("`@("`@(":
- M`@("`@("`A`0$!`@("`@("`@("`@*"@H*"@@("`@("`@("`@("`@("`@("!(>
- M$!`0$!`0$!`0$!`0$!`0A(2$A(2$A(2$A!`0$!`0$!"!@8&!@8$!`0$!`0$!5
- M`0$!`0$!`0$!`0$!`1`0$!`0$(*"@H*"@@("`@("`@("`@("`@("`@("`@("A
- M$!`0$"````````(`````#````.H```#B````G@```&0```!`````-@```"0`6
- M``)P```#,@```Q````0T```$<````^P````H````````!)0```2````$6```U
- M!$0```0P```$"```!`0```0````#_````_@```/T```#\````^P```/H```#5
- MY````^````/<```#V````]0```/0```#S````\@```/$```#P````[P```.X)
- M```#M````[````.L```#J````Z0```.@```#G````Y@```.4```#D````XP`!
- 3``.(```#A````X`````````#\J0`N
- ``
- end
- size 17344
- SHAR_EOF
- cat << \SHAR_EOF > tags
- C_entries ctags.c /^C_entries()$/
- L_funcs ctags.c /^L_funcs (fi)$/
- L_getit ctags.c /^L_getit(special)$/
- Mctags ctags.c /^main(ac,av)$/
- NODE ctags.c 53
- PF_funcs ctags.c /^PF_funcs(fi)$/
- TYST ctags.c 65
- Y_entries ctags.c /^Y_entries()$/
- add_node ctags.c /^add_node(node, cur_node)$/
- begtoken ctags.c /^#define begtoken(arg) (_btk[arg]) \/* T if char can/
- cfree ctags.c /^# define cfree(C) free(C)$/
- endtoken ctags.c /^#define endtoken(arg) (_etk[arg]) \/* T if char end/
- find_entries ctags.c /^find_entries(file)$/
- first_char ctags.c /^first_char()$/
- free_tree ctags.c /^free_tree(node)$/
- getit ctags.c /^getit()$/
- getline ctags.c /^getline()$/
- index ctags.c /^# define index(S, C) strchr(S, C)$/
- init ctags.c /^init()$/
- intoken ctags.c /^#define intoken(arg) (_itk[arg]) \/* T if char can /
- isgood ctags.c /^#define isgood(arg) (_gd[arg]) \/* T if char can be/
- iswhite ctags.c /^#define iswhite(arg) (_wht[arg]) \/* T if char is w/
- max ctags.c /^# define max(I1,I2) (I1 > I2 ? I1 : I2)$/
- pfnote ctags.c /^pfnote(name, ln, f)$/
- put_entries ctags.c /^put_entries(node)$/
- rindex ctags.c /^rindex(sp, c)$/
- savestr ctags.c /^savestr(cp)$/
- start_entry ctags.c /^start_entry(lp,token,tp,f)$/
- striccmp ctags.c /^striccmp(str, pat)$/
- tail ctags.c /^tail(cp)$/
- takeprec ctags.c /^takeprec()$/
- toss_comment ctags.c /^toss_comment(start)$/
- toss_yysec ctags.c /^toss_yysec()$/
- SHAR_EOF
- # End of shell archive
- exit 0
- --
- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
- Have five nice days.
-